package jp.fsoriented.toishi;

import java.util.Date;

import jp.fsoriented.toishi.data.AnmitsuData;
import jp.fsoriented.toishi.data.Result;
import jp.fsoriented.toishi.data.Verse;
import jp.fsoriented.toishi.util.DialogCloseListener;
import jp.fsoriented.toishi.util.L;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.Html;
import android.text.TextUtils;
import android.view.View;
import android.widget.ScrollView;
import android.widget.TextView;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

/**
 * 暗唱画面
 * 
 * @author LapisCactus
 * 
 */
public class TestActivity extends SherlockActivity {

	/** 暗唱する御言葉の指定 */
	public final static String INTENT_PARAM_VERSE_INDEX = "index";

	/** 指定された御言葉オブジェクト */
	private Verse verse;
	/** 指定された御言葉のインデックス */
	private int verseIndex = -1;

	/** 結果入力済みかどうかのフラグ。メインスレッド以外からのアクセスは考慮しない。 */
	private boolean isDone = false;

	/**
	 * TestActivityに遷移する
	 * 
	 * @param context
	 * @param index あんみつデータの箇所
	 */
	public static final void start(Context context, int index) {
		AnmitsuData data = AnmitsuData.getInstance();
		if ((index < 0) || (index >= data.verses.size())) {
			L.w("[test]start Activity failed: index out of range " + index);
			return;
		}
		Intent intent = new Intent();
		intent.setClass(context, TestActivity.class);
		intent.putExtra(INTENT_PARAM_VERSE_INDEX, index);
		context.startActivity(intent);
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_test);
		L.onCreate("Test");
		// フラグクリア
		isDone = false;
		// 引数：Verseのインデックス
		Intent receivedIntent = getIntent();
		if (receivedIntent != null) {
			AnmitsuData data = AnmitsuData.getInstance();
			int index = receivedIntent.getIntExtra(INTENT_PARAM_VERSE_INDEX, 0);
			if ((index < 0) || (index >= data.verses.size())) {
				L.w("[test]setViewData failed: index out of range " + index);
				verseIndex = -1;
			} else {
				verseIndex = index;
			}
		}
		// ActionBar設定
		ActionBar abar = getSupportActionBar();
		abar.setDisplayHomeAsUpEnabled(true);// onOptionsItemSelectedでR.id.homeがイベントで通知されるようになる
	}

	@Override
	protected void onResume() {
		super.onResume();
		L.onResult("Test");
		if (verseIndex != -1) {
			AnmitsuData data = AnmitsuData.getInstance();
			verse = data.verses.get(verseIndex);
			// 表示設定
			TextView view;
			ScrollView scroll;
			view = (TextView) findViewById(R.id.activity_test_text_location);
			view.setText(verse.getLocationName());
			view = (TextView) findViewById(R.id.activity_test_text_hint);
			view.setText(Html.fromHtml("<font color=\"blue\"><u>タップしてヒントを表示</u></font>"));
			// view.setBackgroundColor(Color.rgb(242, 242, 255));
			// view = (TextView) findViewById(R.id.activity_test_text_down);
			scroll = (ScrollView) findViewById(R.id.activity_test_scroll_contents);
			// scroll.setScrollY(0);
			// //view.setHeight(scroll.getHeight());
			// ViewGroup.LayoutParams param = view.getLayoutParams();
			// param.height = scroll.getHeight();
			// view.setLayoutParams(param);
			view = (TextView) findViewById(R.id.activity_test_text_contents);
			view.setText(verse.content);
			scroll = (ScrollView) findViewById(R.id.activity_test_scroll_hint);
			// scroll.setScrollY(0);
			L.d("scroll height:" + scroll.getMeasuredHeight());
			L.d("scroll layout_height:" + scroll.getLayoutParams().height);
			// scroll.setBackgroundColor(Color.rgb(242, 242, 255));
		}
	}

	/**
	 * ヒント領域をタップした
	 * 
	 * @param v
	 */
	public void onHintClick(View v) {
		// ヒントを表示
		TextView view = (TextView) findViewById(R.id.activity_test_text_hint);
		if (TextUtils.isEmpty(verse.hint)) {
			view.setText("ヒントはありません。");
		} else {
			view.setText(verse.hint);
		}
	}

	/**
	 * 暗唱成功ボタン
	 * 
	 * @param v
	 */
	public void onSucceededClick(View v) {
		// 暗唱成功クリック：メッセージ表示後、一覧へ戻る
		// ダブルクリック防止のため、フラグで判断する
		if (isDone) {
			return;
		}
		isDone = true;
		Result r = new Result(new Date(), true);
		verse.result.add(r);
		verse.okCount++;
		AnmitsuData.getInstance().markModified();
		AnmitsuData.getInstance().store(this);
		DialogCloseListener listener = new DialogCloseListener(this);
		new AlertDialog.Builder(this).setTitle("暗唱成功")
				.setMessage("おめでとうございます。あなたは" + verse.okCount + "回暗唱成功しています。何度も暗唱して、自分のものにしましょう。")
				.setPositiveButton("閉じる", listener).setCancelable(true).show();
	}

	/**
	 * 暗唱失敗ボタン
	 * 
	 * @param v
	 */
	public void onFailedClick(View v) {
		// 暗唱失敗クリック：メッセージ表示後、一覧へ戻る
		// ダブルクリック防止のため、フラグで判断する
		if (isDone) {
			return;
		}
		isDone = true;
		Result r = new Result(new Date(), false);
		verse.result.add(r);
		AnmitsuData.getInstance().markModified();
		AnmitsuData.getInstance().store(this);
		DialogCloseListener listener = new DialogCloseListener(this);
		new AlertDialog.Builder(this).setTitle("暗唱失敗")
				.setMessage("みことばを覚える記憶力がいただけるように、神様に祈りましょう。情景や背景とセットで覚えると思い出しやすくなります。")
				.setPositiveButton("閉じる", listener).setCancelable(true).show();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getSupportMenuInflater().inflate(R.menu.menu_test, menu);
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		switch (id) {
		case R.id.menu_test_actionbar_edit:
			L.d("Edit selected.");
			InputActivity.startEditType(this, verseIndex);
			break;
		case R.id.menu_test_actionbar_history:
			L.d("History selected.");
			HistoryActivity.start(this, verse);
			break;
		case R.id.menu_test_actionbar_delete:
			L.d("Delete selected.");
			new AlertDialog.Builder(this).setTitle("削除").setMessage(verse.getLocationName() + "を削除しますか？")
					.setPositiveButton("削除する", new DeleteListener(this, verseIndex)).setNegativeButton("しない", null)
					.setCancelable(true).show();
			break;
		case android.R.id.home:
			L.d("Back selected.");
			finish();
			break;
		}
		return super.onOptionsItemSelected(item);
	}

}

class DeleteListener extends DialogCloseListener {

	/** 削除対象の御言葉のインデックス */
	private int index;

	public DeleteListener(Activity act, int index) {
		super(act);
		this.index = index;
	}

	@Override
	public void onClick(DialogInterface dialog, int which) {
		AnmitsuData data = AnmitsuData.getInstance();
		if ((index >= 0) && (index < data.verses.size())) {
			data.verses.remove(index);
			data.markModified();
		}
		super.onClick(dialog, which);
	}

}
